package com.dkd.sbtz.mapper;

import java.util.Date;
import java.util.List;

import com.dkd.sbtz.domain.AssetSpareVariant;
import com.dkd.sbtz.domain.Spare;
import com.dkd.sbtz.domain.vo.spare.SparePlanInfoDTO;
import com.dkd.sbtz.domain.vo.spare.SpareVO;
import com.dkd.sbtz.domain.vo.spare.SpecialItemDTO;
import org.apache.ibatis.annotations.Param;

/**
 * 备件库存Mapper接口
 * 
 * @author xzj
 * @date 2025-09-03
 */
public interface SpareMapper 
{
    /**
     * 查询备件库存
     * 
     * @param id 备件库存主键
     * @return 备件库存
     */
    public Spare selectSpareById(Long id);



    /**
     * 新增备件库存
     * 
     * @param spare 备件库存
     * @return 结果
     */
    public int insertSpare(Spare spare);

    String selectMaxCodeLike(@Param("prefix") String prefix);
    /**
     * 修改备件库存
     * 
     * @param spare 备件库存
     * @return 结果
     */
    public int updateSpare(Spare spare);

    /**
     * 删除备件库存
     * 
     * @param id 备件库存主键
     * @return 结果
     */
    public int deleteSpareById(Long id);

    int deleteSpareByLongIds(@Param("ids") Long[] ids);
    /**
     * 批量删除备件库存
     * 
     * @param ids 需要删除的数据主键集合
     * @return 结果
     */
    int deleteSpareByIds(@Param("ids") List<Long> ids);

    List<Spare> selectList(@Param("keyword") String keyword);

    List<Spare> selectByIds(@Param("ids") List<Long> ids);

    int insertLinkDefaultQty(@Param("assetId") Long assetId,
                             @Param("spareId") Long spareId,
                             @Param("isPrimary") Integer isPrimary,
                             @Param("remark") String remark);
    /** 向 asset_node_spare 插入关联；qty_need 用表默认 1.00；is_primary 传 0 */
//    int insertNodeSpareLink(@Param("assetId") Long assetId,
//                            @Param("spareId") Long spareId,
//                            @Param("isPrimary") Integer isPrimary,
//                            @Param("remark") String remark);


    int insertNodeSpareLinks(@Param("nodeId") Long nodeId,
                             @Param("spareIds") List<Long> spareIds,
                             @Param("operUser") String operUser,
                             @Param("remark") String remark);

    /** 批量插入（建议表上建唯一索引 (asset_id, spare_id)） */
    int batchInsertNodeSpareLinks(@Param("assetId") Long assetId,
                                  @Param("spareIds") List<Long> spareIds,
                                  @Param("remark") String remark);

    // 备件挂接
    int deleteNodeSpareLinks(@Param("assetId") Long assetId);





    /*批量新增备件信息*/
    // spare
    Spare selectByCode(@Param("code") String code);
    List<Spare> selectByCodes(@Param("codes") List<String> codes);
    // variant
    int batchInsertOrUpdateVariants(@Param("list") List<AssetSpareVariant> list);
    /*批量新增备件信息 end*/


    /*批量备件信息及其明细*/
    List<SpareVO> selectSpareList(@Param("q") Spare q);
    List<AssetSpareVariant> selectVariantsBySpareIds(@Param("ids") List<Long> ids);

    List<SparePlanInfoDTO> selectPlanInfosBySpareIds(@Param("ids") List<Long> ids);
    /*批量备件信息及其明细 end*/




    // 详情（含 variants）
    SpareVO selectSpareVOById(@Param("id") Long id);

    // 被 collection 调用的子查询
    List<AssetSpareVariant> selectVariantsBySpareId(@Param("spareId") Long spareId);
    int batchInsertVariants(@Param("list") List<AssetSpareVariant> list);
    int deleteVariantsBySpareId(@Param("spareId") Long spareId);



    /**
     * 查询某备件下所有厂商（去重）
     */
    List<String> selectVendorsBySpareId(@Param("spareId") Long spareId);

    /**
     * 查询某备件 + 厂商下的所有规格
     */
    List<String> selectSpecsBySpareVendor(@Param("spareId") Long spareId,
                                          @Param("vendor") String vendor);



    Long selectIdByCode(@Param("code") String code);
    Long selectIdByCodeAndOptId(@Param("code") String code,@Param("optId") Long optId);
    int updateSpecialFieldsByCode(@Param("code") String code,
                                  @Param("name") String name,
                                  @Param("planDate") Date planDate,
                                  @Param("orderDate") Integer orderDate,
                                  @Param("updateBy") String updateBy,
                                  @Param("type") Integer type);

    /** 传入一批ID，过滤出其中 type=1 的特殊备件ID */
    List<Long> selectSpecialIdsByIds(@Param("ids") List<Long> ids);


    boolean existsByCode(String code);
    String getMaxCodeByType(String nodeType);

    Spare selectByHash(@Param("hash") String sha256Hash);

}
